#!/bin/bash
set -euo pipefail

# ==================== 自动识别关键路径（无需修改！）====================
# 核心数据目录（admin用户LaunchAgents启动时，默认在用户目录下）
JENKINS_LTS_HOME="$HOME/.jenkins"
# 启动配置文件路径（从 brew services list 提取）
PLIST_PATH="$HOME/Library/LaunchAgents/homebrew.mxcl.jenkins-lts.plist"
# 固定配置（匹配你的版本和环境）
JENKINS_VERSION="2.479.2"
BACKUP_DIR="$HOME/Documents/Jenkins_Backup"
BACKUP_FILENAME="jenkins_home_backup.tar.gz"
PLIST_BACKUP_FILENAME="jenkins_lts_launchd_plist_backup.plist"
# =====================================================================

# 颜色输出函数
red() { echo -e "\033[31m$1\033[0m"; }
green() { echo -e "\033[32m$1\033[0m"; }
yellow() { echo -e "\033[33m$1\033[0m"; }
blue() { echo -e "\033[34m$1\033[0m"; }

# 1. 检查是否为admin用户（匹配启动权限）
if [ "$USER" != "admin" ] && [ "$(id -u -n)" != "admin" ]; then
    yellow "⚠️ 当前用户不是 admin（Jenkins 启动用户），可能导致权限不足"
    read -p "是否继续？（y/n）：" confirm
    if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
        red "❌ 用户取消备份"
        exit 0
    fi
fi

# 2. 验证关键路径存在（核心修复！）
blue "🔍 正在验证 Jenkins LTS 真实路径（admin用户+LaunchAgents）..."
# 验证核心数据目录
if [ ! -d "$JENKINS_LTS_HOME" ]; then
    red "❌ 核心数据目录不存在：$JENKINS_LTS_HOME"
    yellow "ℹ️  尝试查找可能的核心目录..."
    POSSIBLE_HOME=$(find ~ -name ".jenkins" -type d 2>/dev/null | head -1)
    if [ -n "$POSSIBLE_HOME" ]; then
        yellow "   找到可能的核心目录：$POSSIBLE_HOME"
        read -p "是否使用该目录作为核心数据目录？（y/n）：" use_possible
        if [ "$use_possible" = "y" ] || [ "$use_possible" = "Y" ]; then
            JENKINS_LTS_HOME="$POSSIBLE_HOME"
            blue "✅ 已使用找到的核心目录：$JENKINS_LTS_HOME"
        else
            red "❌ 未确认核心目录，脚本退出"
            exit 1
        fi
    else
        red "❌ 未找到任何 Jenkins 核心数据目录，请手动确认后修改脚本"
        exit 1
    fi
fi

# 验证启动配置文件
if [ ! -f "$PLIST_PATH" ]; then
    red "❌ 启动配置文件不存在：$PLIST_PATH"
    yellow "ℹ️  尝试查找 plist 文件..."
    POSSIBLE_PLIST=$(find ~/Library/LaunchAgents -name "*jenkins-lts*plist" 2>/dev/null | head -1)
    if [ -n "$POSSIBLE_PLIST" ]; then
        PLIST_PATH="$POSSIBLE_PLIST"
        blue "✅ 已找到 plist 文件：$PLIST_PATH"
    else
        yellow "⚠️  未找到 plist 文件，不影响核心数据备份（仅端口/JVM参数需手动配置）"
    fi
fi

# 输出最终路径信息
blue "✅ 路径验证成功（适配你的环境）："
blue "   版本：Jenkins LTS $JENKINS_VERSION"
blue "   核心数据目录：$JENKINS_LTS_HOME"
blue "   启动配置文件：$PLIST_PATH"
blue "   启动用户：admin（LaunchAgents 模式）"

# 3. 不停止服务的风险提示
yellow "⚠️  警告：未停止 Jenkins LTS 服务，将排除临时文件避免数据不一致！"
yellow "   核心数据（任务、插件、配置、凭证）不受影响，首次构建会自动生成新 workspace"
read -p "是否继续备份？（y/n）：" confirm
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
    red "❌ 用户取消备份"
    exit 0
fi

# 4. 创建备份目录（确保admin用户可写）
blue "📂 正在创建备份目录..."
mkdir -p "$BACKUP_DIR"
chmod 755 "$BACKUP_DIR"
green "✅ 备份目录已创建：$BACKUP_DIR"

# 5. 备份核心数据（排除临时文件，适配隐藏目录）
blue "💾 正在备份 Jenkins LTS 核心数据（可能需要几分钟）..."
BACKUP_FILE="$BACKUP_DIR/$BACKUP_FILENAME"

# 打包时排除临时目录，保留核心配置
tar -zcf "$BACKUP_FILE" \
    --exclude="$JENKINS_LTS_HOME/workspace/*" \
    --exclude="$JENKINS_LTS_HOME/tmp/*" \
    --exclude="$JENKINS_LTS_HOME/logs/*" \
    --exclude="$JENKINS_LTS_HOME/cache/*" \
    --exclude="$JENKINS_LTS_HOME/builds/*/*/log" \
    -C "$(dirname "$JENKINS_LTS_HOME")" "$(basename "$JENKINS_LTS_HOME")"

if [ -f "$BACKUP_FILE" ] && [ -s "$BACKUP_FILE" ]; then
    green "✅ 核心数据备份成功：$BACKUP_FILE"
    green "   备份大小：$(du -sh "$BACKUP_FILE" | awk '{print $1}')"
else
    red "❌ 核心数据备份失败（文件为空或未创建）"
    exit 1
fi

# 6. 备份启动配置文件（若存在）
if [ -f "$PLIST_PATH" ]; then
    blue "💾 正在备份启动配置文件（端口/JVM参数）..."
    PLIST_BACKUP_FILE="$BACKUP_DIR/$PLIST_BACKUP_FILENAME"
    cp -p "$PLIST_PATH" "$PLIST_BACKUP_FILE"  # 保留文件属性
    green "✅ 启动配置备份成功：$PLIST_BACKUP_FILE"
else
    yellow "⚠️  未找到启动配置文件，跳过备份（目标机器需手动配置端口8080）"
fi

# 7. 备份完成提示
blue "========================================"
green "🎉 Jenkins LTS 2.479.2 备份完成！（完全适配你的环境）"
yellow "⚠️  下一步操作："
yellow "   1. 将备份目录 $BACKUP_DIR 完整传输到目标 M2 机器（AirDrop/scp均可）"
yellow "   2. 目标机器需使用相同的 admin 用户登录，运行配套恢复脚本"
blue "========================================"
blue "ℹ️  备份包含：任务配置、插件、凭证、全局设置（排除临时文件）"
